package com.ebeitech.doorapp.db.dao;

import android.content.ContentValues;
import android.database.Cursor;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

/**
 * Created by alice on 2017/10/24.
 */
public interface BaseDBDao<T> {


	/**
	 * 插入实体类
	 * @param entity
	 * @return
	 */
	public abstract long insert(T entity);


	/**
	 * 插入实体类列表
	 * @param entityList
	 * @return
	 */
	public abstract long[] insertList(List<T> entityList);

	/**
	 *
	 * @param contentValues
	 * @param whereClause
	 * @param whereArgs
	 * @return
	 */
	public abstract long update(ContentValues contentValues, String whereClause, String[] whereArgs);

	/**
	 * 更新实体类
	 * @param entity
	 * @param whereArgs
	 * @param whereClause
	 * @return
	 */
	public abstract long update(T entity,String whereClause,String[] whereArgs);

	/**
	 * 更新实体类列表
	 * @param entityList
	 * @return
	 */
	public abstract long[] updateList(List<T> entityList);

	/**
	 * 插入或更新实体类
	 * @param entity
	 * @return
	 */
	public abstract long insertOrUpdate(T entity);

	/**
	 * 插入或更新实体类
	 * @param entity
	 * @return
	 */
	public abstract long insertOrUpdate(T entity,String whereClause,String[] whereArgs);

	/**
	 * 插入或更新实体类列表
	 * @param entityList
	 * @return
	 */
	public abstract long insertOrUpdateList(List<T> entityList);

	/**
	 * 设置contentValues
	 * @param entity
	 * @param cv
	 * @param type 预执行的操作
	 * @return
	 */
	public abstract String setContentValues(T entity, ContentValues cv,int type) throws InvocationTargetException, InstantiationException, IllegalAccessException;

	/**
	 * 自定义查询
	 * @param sql
	 * @param whereArgs
	 * @return
	 */
	public abstract Cursor rawQuery(String sql, String[] whereArgs);

	/**
	 * 自定义查询Cursor
	 * @param columns
	 * @param whereClause
	 * @param whereArgs
	 * @return
	 */
	public abstract Cursor queryCursor(String[] columns, String whereClause,String[] whereArgs);

	/**
	 * 根据条件查询一条
	 * @param whereClause
	 * @param whereArgs
	 * @return
	 */
	public abstract T query(String[] columns, String whereClause,String[] whereArgs);

	/**
	 * 根据条件查询数据
	 * @param whereClause
	 * @param whereArgs
	 * @return
	 */
	public abstract List<T> queryList(String[] columns,String whereClause,String[] whereArgs);

	/**
	 * 根据条件查询数据
	 * @param whereClause
	 * @param whereArgs
	 * @return
	 */
	public abstract List<T> queryList(String[] columns,String whereClause,String[] whereArgs,String groupBy);
	/**
	 * 根据条件查询数据
	 * @param distinct
	 * @param columns
	 * @param whereClause
	 * @param whereArgs
	 * @param groupBy
	 * @param having
	 * @param orderBy
	 * @param limit
	 * @return
	 */
	public abstract List<T> queryList(boolean distinct,String[] columns,String whereClause,String[] whereArgs,String groupBy,String having,String orderBy,String limit);

	/**
	 * 根据条件查询数量
	 * @param whereClause
	 * @param whereArgs
	 * @return
	 */
	public abstract int queryCount(String whereClause,String[] whereArgs);

	/**
	 * 从游标中获取entity
	 * @param entity
	 * @param cursor
	 */
	public abstract void getEntityFromCursor(T entity,Cursor cursor,String[] columns) throws IllegalAccessException, InstantiationException;

	/**
	 * 从游标中获取entityList
	 * @param list
	 * @param cursor
	 */
	public abstract void getListFromCursor(List<T> list, Cursor cursor,String[] columns) throws IllegalAccessException, InstantiationException ;

	/**
	 * 根据条件删除数据
	 * @param whereClause
	 * @param whereArgs
	 * @return
	 */
	public abstract long delete(String whereClause,String[] whereArgs);

	/**
	 * 删除所有数据
	 * @return
	 */
	public abstract long deleteAll();
}
